package com.kotlin.lib.clazz

fun main() {
    InitOrderDemo("InitOrder")
    println("********************")
    Constructors("constructor test")
}

/**
 * 在实例初始化期间，初始化块按照它们出现在类体中的顺序执行，与属性初始化器交织在一起
 */
private class InitOrderDemo constructor(val name: String) {
    val firstProperty: String = "i'm first property,name = $name".also { println(it) }

    init {
        println("init block. name=$name")
    }


    val secondProperty: String = "i'm second property, name =$name".also(::println)

}

/**
 * 初始化块中的代码实际上会成为主构造函数的一部分。委托给主构造函数会作为次构造函数的第一条语句，
 * 因此所有初始化块与属性初始化器中的代码都会在次构造函数体之前执行。
 *
 * 即使该类没有主构造函数，这种委托仍会隐式发生，并且仍会执行初始化块
 */
private class Constructors {
    var propertyName: String? = null

    init {
        println("init called : $propertyName")
    }

    constructor(name: String) {
        this.propertyName = name
        println("second construct called :$name")
    }

}


